package src

import (
	__ "Ginproject/GinProject/OtherDataFormat/proto"
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
)

type Person struct {
	Name  string `json:"name"`
	Age   int    `json:"age"`
	Phone int    `json:"phone"`
}

func OutJson(ctx *gin.Context) {

	ctx.JSON(http.StatusOK, gin.H{
		"code": 200,
		"msg":  "提交成功",
		"tag":  "<br>",
		"html": "<p>Hello JSON</p>",
	})
}

func UserInfo(ctx *gin.Context) {
	user := Person{
		Name:  "Jackson",
		Age:   434,
		Phone: 19356234512,
	}
	ctx.JSON(http.StatusOK, user)
}

func OutAsciiJSON(ctx *gin.Context) {

	ctx.AsciiJSON(http.StatusOK, gin.H{
		"id":   1,
		"name": "李大炮", // 包含非ASCII字符   确保了非ASCII字符（如中文）被转义为Unicode编码的格式。
		"age":  234,
	})
}

func OutJsonP(ctx *gin.Context) {
	/*
		总结
		JSONP 是一种跨域请求的解决方案，返回的是包含回调函数的JSON数据。
		在Gin中，使用 ctx.JSONP() 方法可以轻松返回 JSONP 格式的响应。
		客户端可以通过 <script> 标签加载这种返回数据，并指定回调函数来处理响应。
	*/
	ctx.JSONP(http.StatusOK, gin.H{
		"code": 200,
		"tag":  "<br>",
		"msg":  "提交成功",
		"html": "<b>Hello, world!</b>",
	})
}

func OutPureJson(ctx *gin.Context) {
	/*
		使用 ctx.PureJSON() 可以避免对HTML字符进行转义，直接返回纯JSON格式的响应，这在处理某些敏感的JSON数据时非常有用。
		如果你不希望JSON数据中的特殊字符被转义，PureJSON 是非常合适的选择。
	*/
	ctx.PureJSON(http.StatusOK, gin.H{
		"id":   1,
		"name": "<Alex>", // 包含HTML字符，不会被转义
		"age":  30,
	})
}

func SecureJSON(ctx *gin.Context) {
	/*
		ctx.SecureJSON() 用于防止JSON劫持，输出的JSON数据带有前缀 ")]}'"，确保安全性。
		适用场景：如果你的API数据被通过<script>标签请求（例如通过JSONP的方式），使用 SecureJSON 可以有效防止劫持攻击。
	*/
	ctx.SecureJSON(http.StatusOK, gin.H{
		"id":   1,
		"name": "WuSir",
		"age":  30,
	})
}

func OutXml(ctx *gin.Context) {

	ctx.XML(http.StatusOK, gin.H{
		"code": 200,
		"tag":  "<br>",
		"msg":  "提交成功",
		"html": "<b>Hello, world!</b>",
	})
}

func OutYaml(ctx *gin.Context) {
	/*
		在Gin框架中，使用 ctx.YAML() 可以方便地返回YAML格式的响应。
		YAML比JSON格式更加简洁，特别是在某些配置文件或者文档输出中，YAML被广泛使用。如果你希望API支持多种数据格式，
		Gin框架为你提供了非常方便的处理方式。
	*/
	ctx.YAML(http.StatusOK, gin.H{
		"code": 200,
		"tag":  "<br>",
		"msg":  "提交成功",
		"html": "<b>Hello, world!</b>",
	})
}

func OutProto(ctx *gin.Context) {
	user_data := &__.User{Name: "alex", Age: 423}

	ctx.ProtoBuf(http.StatusOK, user_data)
}

func RedirectA(ctx *gin.Context) {
	fmt.Println("这里是A路由")
	ctx.Redirect(http.StatusFound, "/redirect_b")
}

func RedirectB(ctx *gin.Context) {
	fmt.Println("这里是B路由")
	ctx.String(http.StatusOK, "这里是B路由")
}
